package cn.tedu.sp11.filter;
import javax.servlet.http.HttpServletRequest;
import org.springframework.cloud.netflix.zuul.filters.support.FilterConstants;
import org.springframework.stereotype.Component;
import org.springframework.util.StringUtils;
import com.netflix.zuul.ZuulFilter;
import com.netflix.zuul.context.RequestContext;
import com.netflix.zuul.exception.ZuulException;
import cn.tedu.web.util.JsonResult;

/**
 * 自定义Zuul过滤器,extends ZuulFilter,只针对item-service服务
 * @author Administrator
 */
@Component
public class AccessFilter extends ZuulFilter{
	/**
	 * 判断当前的请求是否要执行此处的过滤代码,返回true执行过滤代码,返回false不执行了
	 * 只对item-service服务尝试过滤,其他的服务就不过滤了
	 */
	@Override
	public boolean shouldFilter() {
		//1.获取请求上下文对象ctx
		RequestContext ctx = RequestContext.getCurrentContext();
		//2.ctx可以根据key=FilterConstants.SERVICE_ID_KEY得到请求的某个服务id为serviceId
		String serviceId = ctx.get(FilterConstants.SERVICE_ID_KEY).toString();
		//3.判断服务id是否是"item-service"
		if(serviceId.equals("item-service")) {
			return true; //4.执行过滤代码,调用run()
		}
		return false;  //4.不执行过滤代码
	}
	/**
	 * 过滤代码的逻辑主体
	 */
	@Override
	public Object run() throws ZuulException {
		//1.从请求上下文对象ctx得到HttpServletRequest对象request
		RequestContext ctx = RequestContext.getCurrentContext();
		HttpServletRequest req = ctx.getRequest();
		//2.得到请求参数key="token"的值为token
		String token = req.getParameter("token");
		if(StringUtils.isEmpty(token)) {//3.判断token是否是null或空
			//4.1设置阻止请求被路由到后台服务
			ctx.setSendZuulResponse(false);
			//4.2向客户端发送响应,请求成功了,只是没有登陆,响应的内容就是提示请求者当前页面没有登陆
			ctx.setResponseStatusCode(200);
			//响应体必须要是JsonResult对象转为Json串儿的字符串,供前端页面使用
			ctx.setResponseBody(JsonResult.err("Not Login!!").code(JsonResult.NOT_LOGIN).toString());
		}
		//5.返回的数据设计为以后扩展使用,目前该返回值没有被使用
		return null;
	}
	/**
	 * 过滤器类型,处于前置过滤器链内
	 */
	@Override
	public String filterType() {
		return FilterConstants.PRE_TYPE;
	}
	/**
	 * 本过滤器的在过滤器链的优先级,越小越先执行
	 */
	@Override
	public int filterOrder() {
		//该过滤器优先级要 > 5，才能得到封装了服务id的RequestContext对象. PRE_DECORATION_FILTER_ORDER=5
		return FilterConstants.PRE_DECORATION_FILTER_ORDER+1;
	}
}
